# -*- coding: utf-8 -*-
import wikipedia,re
from datetime import datetime,date,timedelta
def obtenerplantilla():
        pagina = (wikipedia.Page(wikipedia.getSite(),"Plantilla:Recordatorio CAD"))
        return pagina
 
def retirarplantilla(textoplantilla,articulo):
   print "retirando" + articulo
   texto = "\{\{RCAD\|"+articulo+ ".*\}\}"
   cadena = re.compile("\(")
   texto = cadena.sub("\(", texto)
   cadena = re.compile("\)")
   texto = cadena.sub("\)",texto) 
   cadena = re.compile(texto)
   textoplantilla = cadena.sub("",textoplantilla)
   cadena = re.compile("\s+\n")
   textoplantilla = cadena.sub("\n",textoplantilla)
   print textoplantilla
   return textoplantilla
 
def agregarplantilla(textoplantilla,articulo):
   texto = "{{RCAD|" + articulo +"| | | }}"
   cadena = re.compile("(\{\{RCAD\|.*\}\}\n)\|}")
   textonuevo = "\\1{{RCAD|" + articulo + "| | | }}\n|}"
   textoplantilla = cadena.sub(textonuevo,textoplantilla)
   return textoplantilla
 
def actualizarplantilla(textoplantilla,articulo,agregadoretirado):
     print "Entre con" + str(agregadoretirado)
     plantilla = (wikipedia.Page(wikipedia.getSite(),u"Wikipedia:Candidatos a artículos destacados"))
     plantilla = plantilla.get()
     cadena=re.compile("\(")
     articulo1=cadena.sub("\(",articulo)
     cadena = re.compile("\)")
     articulo1=cadena.sub("\)",articulo1)
     reemplazo = re.search(articulo1,plantilla)
 
     #La CAD termino
     if reemplazo == None:
          textoplantilla=retirarplantilla (textoplantilla,articulo)
          agregadoretirado = 1
          return textoplantilla, agregadoretirado
     print "ACA ES" + str(agregadoretirado)     
     return textoplantilla, agregadoretirado
 
def agregararticulos(textoplantilla):   
     plantilla = (wikipedia.Page(wikipedia.getSite(),u"Wikipedia:Candidatos a artículos destacados"))
     plantilla = plantilla.get()
     articulos = re.findall("\{\{\/.*\}\}",plantilla)
     for art in articulos:
         cadena = re.compile("\{\{\/")
         art = cadena.sub("",art)
         cadena = re.compile("\}\}")
         art = cadena.sub("",art)
         cadena = re.compile("\(")
         art1 = cadena.sub("\(",art)
         cadena = re.compile("\)")
         art1 = cadena.sub("\)",art1)
         busqueda = re.search(art1,textoplantilla)
         if busqueda == None:
            textoplantilla = agregarplantilla(textoplantilla,art)
 
     return textoplantilla
#def obtenerlistadearticulos(texto):
 #Obtengo los articulos
 #m1 = re.search("\{\{RCAD\|.*\}\}",texto)
 #m2 = re.search("\}\}\n\|}",texto)
 #i1= m1.start()
 #i2= m2.end()
 #nuevotexto = texto[i1:i2]
 #nuevotexto=re.sub("\{\{RCAD\|","",nuevotexto)
 #nuevotexto=re.sub("\|","",nuevotexto)
 #nuevotexto=re.sub("\}*","",nuevotexto)
 #Listo los articulos
 #articulos=re.split("\n",nuevotexto)
 #wikipedia.stopme()
 #return articulos
#def obtenerlistadearticulos(texto):
#  m1 = re.search("\{\{RCAD\|.*\}\}",texto)
#  m2 = re.search("\}\}\n\|}",texto)
#  i1= m1.start()
#  i2= m2.end()
#  nuevotexto = texto[i1:i2]
#  m1 = re.compile("\{\{RCAD\|(.*)\|.*\|.*\|.*\}\}")
#  articulos = m1.sub("\\1",nuevotexto)
#  articulos = re.sub("\|}","",articulos)
#  articulos = re.split("\n",articulos)
#  articulos.remove(u"")
#  print articulos
#  return articulos
def obtenerlistadearticulos(texto):
    articulos = re.findall("\{\{RCAD\|.*\}\}",texto)
    listaarticulos=None
    for art in articulos:
       cadena = re.compile("\{\{RCAD\|")
       art = re.split("\|",art)
       art = art[1]
       if listaarticulos == None:
             listaarticulos = [art]
       else:
             listaarticulos.append(art)
    return listaarticulos
 
def obtenerCAD(articulo):
 #Obtengo la CAD del articulo
 CAD = u"Wikipedia:Candidatos a artículos destacados/"+articulo
 pagina=(wikipedia.Page(wikipedia.getSite(),CAD))
 return pagina
 
def coeficientes(edicion):
 valor = datetime.today() - datetime.strptime(edicion[1],u"%Y-%m-%dT%H:%M:%SZ")
 return valor > timedelta(days=2) 
 
def calcularparticipacion(CAD):
 print CAD
 ediciones = CAD.getVersionHistory(False,False,True)
 primeraedicion = (ediciones[0])
 ultimaedicion = (ediciones[len(ediciones)-1])
 fecha1= datetime.strptime(primeraedicion[1],u"%Y-%m-%dT%H:%M:%SZ")
 fecha2= datetime.strptime(ultimaedicion[1],u"%Y-%m-%dT%H:%M:%SZ")
 diferenciafecha = fecha1 - fecha2
 diasinparticipar = datetime.today() - fecha1
 if (primeraedicion == ultimaedicion) and (diasinparticipar>timedelta(days=1)):
         return 0
 if (fecha1 != fecha2) or (diferenciafecha > timedelta(days=3)):
    diasinparticipar = datetime.today() - fecha1
    #print diasinparticipar
    #print diferenciafecha
    if (diasinparticipar > timedelta(days=3)):
            return 0
    else:
            if (diasinparticipar<=timedelta(days=2)):
              return 2
            else:
             return 1
 
def calcularotros(CAD):
 ediciones = CAD.getVersionHistory(False,False,True)
 primeraedicion = (ediciones[len(ediciones)-1])
 ultimaedicion = ediciones[0]
 fecha1= datetime.strptime(primeraedicion[1],u"%Y-%m-%dT%H:%M:%SZ")
 fecha2= datetime.strptime(ultimaedicion[1],u"%Y-%m-%dT%H:%M:%SZ")
 texto = CAD.get()
 if (re.search("\{\{Cierre ACAD.*\}\}",texto)):
                    return "24h"
 if (fecha1==fecha2) or ((fecha2-fecha1)<=timedelta(days=3)):
     return "Nueva"
 else:
         if (datetime.today() - fecha2)>=timedelta(days=3):
            return "Emergencia"
 
def AgregarActividad(Estado,texto,articulo):
 cadaux = re.compile("\(")
 articulo1 = cadaux.sub("\(",articulo)
 cadaux = re.compile("\)")
 articulo1= cadaux.sub("\)",articulo1)
 #print articulo1
 cadenavieja="\{\{RCAD\|" + articulo1 + "\|.*\|.*\|.*\}\}"
 cadaux = re.split("\|",cadenavieja)
 #print cadaux
 reemplazo = re.findall(cadenavieja,texto)
 reemplazo = reemplazo[0]
 reemplazo = re.split("\|",reemplazo)
 participacion = reemplazo[2]
 usuarios = reemplazo[3]
 otros = reemplazo[4]
 #print reemplazo
 cadenanueva="{{RCAD|"+articulo+"|"+str(Estado)+"|"+usuarios+"|"+otros+"}}"
 #print cadenanueva
 texto = re.sub(cadenavieja,cadenanueva,texto)
 #print texto
 return (texto)
 
def AgregarOtros(Estado,texto,articulo):
  #print "entre"
  #print texto
  cadaux = re.compile("\(")
  articulo1 = cadaux.sub("\(",articulo)
  cadaux = re.compile("\)")
  articulo1 = cadaux.sub("\)",articulo1)
  cadenavieja="\{\{RCAD\|"+ articulo1 + "\|.*\|.*\|.*\}\}"
  #print cadenavieja
  reemplazo = re.findall(cadenavieja,texto)
  reemplazo = reemplazo[0]
  reemplazo = re.split("\|",reemplazo)
  participacion = reemplazo[2]
  usuarios = reemplazo[3]
  if Estado == None:
          Estado = ""
  cadenanueva="{{RCAD|"+articulo+"|"+participacion+"|"+usuarios+"|"+str(Estado)+"}}"
  texto = re.sub(cadenavieja,cadenanueva,texto)
  return texto
  #return textonuevo
 
def usuariosparticipantes(CAD,articulo,texto):
  ediciones = CAD.getVersionHistory(False,False,True)
  #cadenavieja="\{\{RCAD\|"+articulo1+"\|.*\|.*\|.*\}\}"
  cadaux=re.compile("\(")
  articulo1=cadaux.sub("\(",articulo)
  cadaux = re.compile("\)")
  articulo1=cadaux.sub("\)",articulo1)
  cadenavieja="\{\{RCAD\|"+articulo1+"\|.*\|.*\|.*\}\}"
  reemplazo = re.findall(cadenavieja,texto)
  #print reemplazo
  reemplazo = reemplazo[0]
  reemplazo = re.split("\|",reemplazo)
  #print reemplazo
  usuarios = None
  for edicion in ediciones:
        if usuarios == None:
             usuarios = [edicion[2]]
        else:
             usuarios.append(edicion[2])
 
  usuarios = list(set(usuarios))
  participacion = reemplazo[2]
  otros = reemplazo[4]
  cantusuarios = len(usuarios)
  #print participacion + str(usuarios) + otros
  #print usuarios
  cadenanueva="{{RCAD|"+articulo+"|"+participacion+"|"+str(cantusuarios)+"|"+otros
  texto = re.sub(cadenavieja,cadenanueva,texto)
  return texto
 
def firma(textoplantilla):
  print "Entreee"
  cadena=re.compile("Actualizado por .*\n")
  textoplantilla = cadena.sub("Actualizado por ~~~~\n",textoplantilla)
  #print textoplantilla
  return textoplantilla
 
def actualizarcontador(textoplantilla):
  pagina = (wikipedia.Page(wikipedia.getSite(),u"Wikipedia:Candidatos a artículos destacados/Número"))
  cadena = "\{\{RCAD.*\}\}"
  numero = re.findall(cadena, textoplantilla)
  numero = len(numero)
  texto=u"<noinclude>Pon aquí el número de [[Wikipedia:Candidatos a artículos destacados|candidaturas para artículo destacado]] que están actualmente en curso: </noinclude>"  
  texto= texto + str(numero)
  pagina.put(texto,u"Actualizando el contador")
 
pagina = obtenerplantilla()
textoplantilla=pagina.get()
textoplantilla=agregararticulos(textoplantilla)
articulos = obtenerlistadearticulos(textoplantilla)
agregadoretirado = None
for articulo in articulos:
        if articulo == "": break
        CAD = obtenerCAD(articulo)
        Estado = calcularparticipacion(CAD)
        textoplantilla = AgregarActividad(Estado,textoplantilla,articulo)  
        textoplantilla, agregadoretirado=actualizarplantilla(textoplantilla,articulo,agregadoretirado)
        if agregadoretirado != 1:
            Estado = calcularotros(CAD)
            textoplantilla = AgregarOtros(Estado,textoplantilla,articulo)
            textoplantilla = usuariosparticipantes(CAD,articulo,textoplantilla)
        agregadoretirado = 0
 
 
textoplantilla = firma(textoplantilla)
summary=u"Actualizando valores"
pagina.put(textoplantilla,summary)
actualizarcontador(textoplantilla)
#print textoplantilla